package com.example.demo.common;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import sun.security.util.Password;

import java.util.Locale;
import java.util.UUID;

/**
 * @program: demo
 * @author: JCM
 * @create: 2023-08-21 10:34
 * @description:
 **/
public class PasswordUtils {
    /**
     * 加盐生成密码
     * @param password 明文密码
     * @return  finalPassword 加密后的密码
     */
    public static String encrypt(String password) {
        // 盐值 32 位
        String salt = UUID.randomUUID().toString().replace("-","");
        // 生成加盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());
        // 生成最终密码(保存到数据库中的密码，32位盐值+@+32位加盐之后的密码）
        String finalPassword = salt+"@"+saltPassword;
        return finalPassword;
    }

    /**
     * 生成加密的密码（方法1的重载）
      * @param password 明文密码
     * @param salt 固定的盐值
     * @return 最终密码
     */
    public static String encrypt(String password, String salt) {
        // 1. 生成一个加盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());
        // 2. 生成最终的密码
        String finalPassword = salt+"@"+saltPassword;
        return finalPassword;
    }

    /**
     * 验证密码
     * @param password 明文密码
     * @param finalPassword 数据库中保存的最终密码
     * @return
     */
    public static boolean check(String password,String finalPassword) {
        if(StringUtils.hasLength(password) && StringUtils.hasLength(finalPassword)
                && finalPassword.length() == 65) {
            // 1. 得到盐值
            String salt = finalPassword.split("@")[0];
            // 2. 使用之前的加密操作，将明文密码加密生成最终的密码
            String confirmPassword = PasswordUtils.encrypt(password,salt);
            // 3. 对比两个最终密码是否相同
            return confirmPassword.equals(finalPassword);
        }
        return false;
    }

}
